/*
 * Compensation.h
 *
 *  Created on: Oct 4, 2024
 *      Author: Grasping
 */

#ifndef INC_MY_MATH_H_
#define INC_MY_MATH_H_

#include <stdbool.h>
#include <stdint.h>

/*******数学常量*********/
#define Sqrt_2                     1.414213562f // √2
#define Sqrt_3                     1.732050807f // √3
#define Sqrt_3_Div_2               0.866025403f // √3 / 2
#define pi                         3.141592653f // π

// 更精确的数学常量
#define _SQRT2                     1.41421356237f // √2
#define _SQRT3                     1.73205080757f // √3
#define _SQRT3_D2                  0.86602540378f // √3 / 2
#define _SQRT3_D3                  0.57735026919f // √3 / 3

// 其他数学常量
#define _2D_3                      0.66666666667f // 2 / 3
#define _1D_3                      0.33333333333f // 1 / 3
#define _1D_2                      0.5f           // 1 / 2
#define Q15_MAX                    0x8000U        // Q15最大值
#define Q31_MAX                    0x80000000U    // Q31最大值

// PI相关常量
#define _360PI                     1130.97335529f // 360 * π
#define _2PI                       6.28318530718f // 2 * π
#define _PI                        3.14159265359f // π
#define _2PI_D3                    2.09439510239f // 2 * π / 3

#define _180_DPI                   57.29577951308f // 180 / π
#define _30_DPI                    9.54929658551f  // 30 / π
#define _3_DPI                     0.95492965855f  // 3 / π
#define _1_D2PI                    0.15915494309f  // 1 / (2 * π)

#define _PI_D2                     1.57079632679f // π / 2
#define _PI_D3                     1.04719755120f // π / 3
#define _PI_D4                     0.78539816340f // π / 4
#define _PI_D30                    0.10471975512f // π / 30
#define _PI_D180                   0.01745329252f // π / 180

#define _TRUE                      1U
#define _FALSE                     0U
#define _abs(x)                    ((x) < 0 ? -(x) : (x))                                      // ����ֵ����
#define _sign(x)                   ((x) > 0 ? 1 : -1)                                          // ���ź���
#define _max(a, b)                 ((a) > (b) ? (a) : (b))                                     // ���ֵ����

#define _sat(s, delta)             ((s) > (delta) ? 1 : ((s) < (-delta) ? -1 : (s) / (delta))) // ���ͺ���
#define _fmod(x, y)                ((y) == 0.0f ? NAN : (x) - (int)((x) / (y)) * (y))          // ȡģ����
#define _constrain(val, low, high) ((val) < (low) ? (low) : ((val) > (high) ? (high) : (val))) // �޷�����
#define _norm_angle(angle) \
    ((angle) < 0 ? ((angle) + _2PI) : ((angle) == _2PI ? 0 : _fmod((angle), _2PI))) // �Ƕȹ�һ������
#define _isInRange(value, lower_bound, upper_bound) \
    (bool)((value) > (lower_bound) && (value) < (upper_bound)) // �ж��Ƿ��ڷ�Χ�꺯��

#define SIN_TABLE_SIZE_1024   1024U              // ���ұ���С,�ֱ���Խ�󾫶�Խ��
#define SIN_TABLE_SIZE_512    512U               // ���ұ���С,�ֱ���Խ�󾫶�Խ��
#define SIN_TABLE_SIZE        SIN_TABLE_SIZE_512 // ѡ��512���Ȳ��ұ�

#define SIN_LINER_INTER_EN    0U // ���Բ�ֵʹ��
#define SIN_COS_MODE          0U // ѡ����ȡSin Cos��ģʽ  0-����ʽ���  1-�����
#define Q31_MODE              0U // ����ʽ���ģʽ  0-������� 1-Q31����(δʵ��)

#define ATAN_TABLE_SIZE       1024U // 1024-4KB 512-2KB ���ұ���С,�ֱ���Խ�󾫶�Խ��
#define ATAN_LINER_INTER_EN   1U    // ���Բ�ֵʹ��
#define ATAN_MODE             1U    // �����е�ģʽ  1-�����

// 浮点转Q31宏函数
// 参数说明：
//   f: 单精度浮点数输入
//   norm: 归一化参数（浮点数的实际最大范围，用于缩放至[-1, 1)区间）
#define FLOAT_TO_Q31(f, norm) ((int32_t)(((f) / (norm)) * Q31_MAX))

// Q31转浮点函数
// 参数说明：
//   q: Q31格式的整数
//   norm: 归一化参数（需与浮点转Q31时的参数一致）
#define Q31_TO_FLOAT(q, norm) (((float)q * norm) / (float)(Q31_MAX))

// ����һ�𵥴����л���202.02ns
float fast_sin(float x);
float fast_cos(float x);

// �������л���160.81ns
void fast_sin_cos(float x, float *sin_x, float *cos_x);
void fast_sin_three_phase(float wt, float results[3]);
// �������л���407.26ns

float FastSqrt(float number);
float FastInvSqrt(float number);
float _atan(float x);
float _atan2(float y, float x);

void Sin_Data_init(float *Sine_Data, uint32_t size);
void Cos_Data_init(float *Cos_Data, uint32_t size);
void SinCos_Data_init(float *Cos_Data, float *Sin_Data, uint32_t size);

#endif /* __MY_MATH_H__ */
